#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
 
#define MAX_ARRAY_DIM 10
#define ERROR -1
#define OK 0
#define OVERFLOW 1
typedef int Status;
 
typedef int ElemType;// 数组元素类型
 
typedef struct {
    int dim;            // 数组维度
    int *bounds;        // 每一维的大小
    int *constants;     // 常量部分，用来计算偏移
    ElemType *base;     // 数组元素的基地址
} Array;
 
// 初始化数组
Status InitArray(Array *A, int dim, ...) {
    int elemtotal = 1;  // 元素总数
    if (dim < 1 || dim > MAX_ARRAY_DIM)
        return ERROR;
     
    A->dim = dim;
    A->bounds = (int *)malloc(dim * sizeof(int));
    if (!A->bounds) exit(OVERFLOW);
 
    va_list ap;
    va_start(ap, dim);
    for (int i = 0; i < dim; i++) {
        A->bounds[i] = va_arg(ap, int);
        if (A->bounds[i] < 0)
            return ERROR;
        elemtotal *= A->bounds[i];
    }
    va_end(ap);
 
    A->base = (ElemType *)malloc(elemtotal * sizeof(ElemType));
    if (!A->base) exit(OVERFLOW);
 
    A->constants = (int *)malloc(dim * sizeof(int));
    if (!A->constants)
        exit(OVERFLOW);
 
    A->constants[dim - 1] = 1;
    for (int i = dim - 2; i >= 0; i--) {
        A->constants[i] = A->bounds[i + 1] * A->constants[i + 1];
    }
 
    return OK;
}
 
// 获取元素的偏移量
Status Locate(Array A, va_list ap, int *off) {
    int ind;
    *off = 0;  // 初始化偏移量
    for (int i = 0; i < A.dim; i++) {
        ind = va_arg(ap, int);    // 取出当前下标值
        if (ind < 0 || ind >= A.bounds[i])
            return ERROR;
        *off += A.constants[i] * ind;    // 累加相对地址
    }
    return OK;
}
 
// 赋值元素
Status Assign(Array *A, int dim, ElemType e, ...) {
    va_list ap;
    int off = 0;
 
    va_start(ap, e);  // 传递其他参数
    if (Locate(*A, ap, &off) == ERROR) {
        va_end(ap);
        return ERROR;
    }
    *(A->base + off) = e;  // 赋值
    va_end(ap);
 
    return OK;
}
 
// 获取元素
Status Value(Array A, ElemType *e, ...) {
    va_list ap;
    int off = 0;
 
    va_start(ap, e);  // 传递其他参数
    if (Locate(A, ap, &off) == ERROR) {
        va_end(ap);
        return ERROR;
    }
    *e = *(A.base + off);  // 获取元素
    va_end(ap);
 
    return OK;
}
 
int main() {
    ElemType e;
    Array A;
    InitArray(&A, 3, 2, 3, 7);  // 初始化数组，3维，大小分别为 2, 3, 4
 
    // 给数组赋值
    Assign(&A, 3, 1, 0, 0, 1);
    Assign(&A, 3, 2, 0, 1, 2);
    Assign(&A, 3, 3, 0, 2, 3);
    Assign(&A, 3, 4, 1, 0, 4);
    Assign(&A, 3, 5, 1, 1, 5);
    Assign(&A, 3, 6, 1, 2, 6);
 
    // 获取元素
    Value(A, &e, 1, 2, 6);  // 获取元素 [0][1][2]
    printf("%d\n", e);  // 输出元素值
 
    return 0;
}